F/OSS 코믹스

4. 처음에는 어떻게 프로그래밍을 했을까?

올린 날: 2016년 12월 5일

배선에서 프로그램 내장 방식으로

컴퓨터가 처음 만들어졌을 때, 사람들은 어떻게 프로그래밍을 했을까? 초기 컴퓨터는 오늘날과 같은 소프트웨어는 없었고, 탁상 계산기 같아서 릴레이나 진공관 같은 스위치로 논리회로 구성해서 한가지 용도로만 사용할 수 있었다.

두 기술자가 서로 다른 대형 계산 장치의 제어판을 가리킨다.

독일군 암호 해독을 위한 장치
이건 사칙연산을 위한 계산기

한 사람이 턱을 괸 채 탄도 계산용 컴퓨터를 구상한다.

탄도 계산하는 장치를 만들어 볼까?
이번에는 릴레이가 몇개 필요할까? 진공관도 필요하겠군

에니악(ENIAC)은 플러그판(plugboard)의 배선과 스위치 설정을 바꾸어 서로 다른 프로그램을 실행할 수 있었다. 매우 번거로운 작업으로, 프로그램을 변경하는 데 며칠이 걸리기도 했다. 천공카드는 프로그램을 저장하는 것이 아니라 데이터의 입력과 출력에 사용했다[1][4].

두 프로그래머가 에니악의 플러그판 배선을 연결하며 프로그램을 설정한다.

프로그램 내장형 컴퓨터가 등장하면서 프로그래밍은 훨씬 실용적으로 바뀌었다. 프로그램을 전자식 기억장치로 불러와 배선을 바꾸지 않고 실행할 수 있게 된 것이다. 맨체스터 베이비는 1948년에 프로그램을 실행했고, 에드삭(EDSAC)은 1949년에 정규 운용을 시작했다. 에드박(EDVAC)은 프로그램 내장 방식의 발전에 큰 영향을 주었지만, 실제 가동은 그보다 늦었다.

기계어에서 어셈블리어로

프로그램은 기계가 이해하고 실행할 수 있는 명령어로 이루어진다. 가장 낮은 수준의 명령어를 기계어라고 한다. 기계어는 0과 1로 이루어진 이진수 패턴으로 표현되기 때문에 사람이 읽고 기억하기 어렵다.

검은 안경을 쓴 프로그래머가 길게 늘어선 이진수를 살펴본다.

그래서 컴퓨터 프로그래밍의 초기부터 어셈블리어의 초기 형태가 등장했다. 숫자로 된 기계 명령 대신 니모닉(mnemonic)이라는 짧은 기호를 사용해 명령을 더 쉽게 표현한 것이다. 에드삭 프로그래머들은 한 글자로 된 오더 코드를 사용했고, Initial Orders라는 작은 부트스트랩 프로그램이 종이테이프에서 이 코드를 읽어 기계 명령으로 변환해 메모리로 로딩했다[2].

EDSAC의 각 명령은 17비트 워드 하나를 차지했다.

  • 첫번째 열, 다섯 비트는 동작 코드(Operation code)
  • 두번째 열, 한 비트는 사용하지 않는 비트
  • 세번째 열, 열 비트는 피연산자(operand)인데, 주소를 나타낸다.
  • 마지막 비트는 짧은 피연산자와 긴 피연산자 가운데 하나를 선택했다.
두 개의 17비트 EDSAC 명령을 동작 코드, 사용하지 않는 비트, 피연산자 주소, 길이 비트로 나누고 T0S와 H2S 니모닉을 함께 표시한 도표.

위 그림에 소개된 EDSAC의 두 어셈블리 명령은 아래와 같이 설명할 수 있다.

  • T 0 S: T는 명령코드로 A를 의미하는 누산기(accumulator)의 상위 17비트를 메모리 주소 0에 저장한 다음, 누산기를 0으로 초기화한다.
  • H 2 S: H는 명령코드로 메모리 주소 2의 값을 곱셈 레지스터(multiplier register) R로 불러와 곱셈 연산을 준비한다.

마지막 S는 명령어 자체가 아니라 피연산자의 길이가 짧은 형식임을 나타낸다. 짧은 피연산자는 17비트, 긴 피연산자는 35비트였다[6].

이와 같이, 기계어는 명령어 자체가 이진수에 불과하기 때문에 사람이 기억하고 바로 코드를 이해하기가 어렵다. 그래서 각각의 명령어를 상징적 기호(mnemonics)로 표현하는 어셈블리(assembly) 언어를 만들었다. 이렇게 표현된 코드를 CPU가 이해할 수 있는 기계어 코드로 변환하는 과정을 어셈블링(assembling)이라고 한다.

프로그래머가 어셈블리어 판에 T0S와 H2S를 쓰고, 컴퓨터가 기계어 코드 판에 이진수 명령을 적는다. 두 판은 어셈블링이라고 표시한 화살표로 이어져 있다.

어셈블러를 이용할 수 없는 환경에서는 프로그래머가 어셈블리 코드를 직접 기계어로 바꾸기도 했다. 이를 핸드 어셈블리(hand assembly)라고 한다. 명령어 표에서 니모닉에 해당하는 숫자 코드를 찾고, 필요한 메모리 주소를 계산해 기계어 명령을 완성하는 작업이었다. 이러한 초기 형태의 어셈블리어는 고급 언어가 널리 쓰이기 전인 1940년대 말과 1950년대 초부터 이미 사용되고 있었다.

프로그래머가 모형 로켓을 옆에 두고 책상에서 종이에 코드를 쓴다.

지금은 코딩중

터미널과 시분할 시스템

1960년대 초에도 터미널에서 명령을 입력하고 결과를 바로 확인하는 대화형 시스템은 있었다. MIT의 CTSS는 1961년에 처음 시연되었다. 다만 초기 터미널은 화면 대신 종이에 결과를 인쇄하는 경우가 많았다. 터미널이 있다고 해서 오늘날처럼 모니터를 보며 작업한 것은 아니었다.

1964~1965년에 MIT Project MAC, 벨 연구소, 제너럴 일렉트릭의 공동 프로젝트로 설계가 시작된 멀틱스(Multics)는 이러한 시분할 방식을 발전시키려 했다. 시분할은 컴퓨터 한 대의 처리 시간을 여러 사용자에게 짧게 나누어 주어, 각자가 자기 터미널에서 대화식으로 작업할 수 있게 하는 방식이다[3].

프로그래머가 테이프 릴과 화면, 프린터가 달린 대형 컴퓨터 옆에서 키보드를 사용하며 미소 짓는다.

드디어 키보드와 모니터가

1970년대에는 화면과 키보드를 갖춘 터미널도 점차 널리 쓰였다. 그렇다면 터미널을 직접 이용할 수 없었던 프로그래머들은 어떻게 코드를 작성하고 결과를 확인했을까?

천공카드와 배치 처리

초기 프로그래머들은 천공카드를 이용해 코드를 입력하는 경우가 많았다. 천공카드는 19세기 말부터 미국 인구조사를 비롯한 기계 처리 작업에서 데이터를 기록하고 저장하는 데 쓰였다. 원리는 오늘날의 OMR(광학 마크 인식) 용지를 생각하면 이해가 쉬운데, OMR 용지는 특정 위치를 표시하고, 천공카드는 특정 위치에 구멍을 뚫어 정보를 표현한다.

IBM은 1928년에 널리 쓰이게 된 80열 카드를 표준화하고 카드, 키펀치, 카드 판독기, 집계 장비를 세계 여러 지역에 공급했다. 이후 천공카드는 프로그램과 데이터를 컴퓨터에 입력하는 중요한 매체가 되었다[5].

손에 든 노란색 천공카드 위에 포트란 프로그래밍을 위한 천공카드라고 적혀 있다.

실제 천공카드를 사용하려면, 프로그래머는 먼저 코딩 용지에 소스 코드를 쓰고 손으로 검토했다. 그런 다음 프로그래머나 키펀치 작업자가 프로그램을 카드에 천공했으며, 보통 카드 한 장에 소스 코드 한 줄을 기록했다. 긴 문장은 여러 카드에 걸쳐 이어질 수 있었다. 키펀치는 입력한 문자를 구멍으로 기록했고, 기계어 변환은 키펀치가 아니라 컴퓨터에서 실행되는 어셈블러나 컴파일러가 담당했다.

프로그래머가 IBM 026 키펀치 기계에 앉아 코드를 천공카드로 옮긴다.
IBM 026 키펀치 기계

코드를 어서 천공 카드에 옮겨야지

프로그래머가 카드 덱을 전산실 오퍼레이터에게 제출하면, 오퍼레이터가 각 작업을 카드 판독기에 넣었다. 카드 덱을 제출하기 위해 줄을 서기도 했고, 인쇄된 결과를 받을 때까지 오랫동안 기다려야 할 수도 있었다. 프로그램이 실패하면 문제가 있는 카드를 수정하거나 교체한 뒤 카드 덱을 다시 제출해야 했다.

네 명의 프로그래머가 천공카드를 들고 전산실 창구에 줄을 서고, 오퍼레이터가 작업을 접수한다.

이거 좀 봐주세요
다음 사람

프로그램을 카드나 종이테이프에 천공하기 전이라면, 다른 사람이 종이에 손으로 쓴 프로그램을 그대로 베껴 쓰는 것만으로도 프로그램을 복사할 수 있었다.

주인공이 옆 사람을 곁눈질하며 천공카드로 옮기기 전의 손글씨 코드를 몰래 베껴 쓴다.

참고 자료

  1. 펜실베이니아 대학교 공과대학의 역사: 에니악
  2. EDSAC 초기 명령과 제곱수 프로그램
  3. 멀틱스의 역사
  4. 에니악, 미국 컴퓨터 역사 박물관
  5. IBM 천공카드
  6. EDSAC의 기억장치와 명령어